package Servicios;

import DAO.AdministradorDAO;
import DAO.SalaDAO;
import Entidad.Administrador;
import Entidad.Sala;
import VO.AdministradorVO;
import java.util.ArrayList;
import java.util.Arrays;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceException;


public class ServicioAdministrador {

    /**
     * <p>Método que valida el inicio de sesión de un administrador.</p>
     *
     * @param cedula
     * @param contraseña
     *
     * @return Cédula del administrador si el login fue correcto, -1 si la
     * contraseña no coincide, -2 si el administrador no existe.
     */
    public long iniciarSesion (Long cedula, char[] contraseña,EntityManager em){
        AdministradorDAO dao = new AdministradorDAO();
        Administrador u = dao.encontrar(cedula,em);
        if (u!=null){
            if (Arrays.equals(contraseña, u.getContrasena())){
                return u.getSala().getId();
            }else{
                return 0L;
            }
        }
        return 0L;
    }

    /**
     * <p>Inicializacion del DAO de Administrador</p>
     *
     */
    AdministradorDAO adminDAO= new AdministradorDAO();

    /**
     * <p>Verifica la validez de la cedula recibida</p>
     *
     * @return Verdadero: Si la cedula está dentro de los parametros establecidos. -
     * Falso: Si la cedula no esta en los establecidos.
     */
    public boolean validarCedula(long cedula){
        return (cedula>=10000000 && cedula < 100000000)||(cedula >= 1010000000);
    }
    /**
     * <p>Verifica que el administrador a crear no exista actualmente
     * con ese numero de cedula./p>
     * @return Verdadero: Si hay un Administrador ya registrado con esa cedula. -
     * Falso: Si noy hay ningún administrador con ésa cedula registrado.
     */
    public boolean yaExiste(Long cedula,EntityManager em){
        return adminDAO.encontrar(cedula,em)!=null;
    }
    /**
     * <p>Envia los datos necesarios para que el DAO haga la persistencia del Administrado</p>
     * @param em  EntityManager para realizar las operacions con JPA.
     */
    public void crearadmin(AdministradorVO avo,EntityManager em) throws Exception {
        SalaDAO salaDAO = new SalaDAO();
        Sala sala =salaDAO.buscarPorNombre(avo.getNombresala(),em);
        Administrador administrador= new Administrador(avo.getCedula(),avo.getNombre(),avo.getContrasena(),sala, avo.getCorreoUnal(), avo.getOtroCorreo(), avo.getDireccion(), avo.getTelefono());
        adminDAO.crear(administrador,em);
        
    }
  
     /**
     * <p>Borra el Administrador que contiene como cedula(PK) el parametro cedula</p>
     * @param em  EntityManager para realizar las operacions con JPA.
     * @param  cedula Long  que guarda la cedula (PK) del administrador
     */
    public void borrar(long cedula,EntityManager em)throws PersistenceException,Exception{
        adminDAO.borrar(cedula,em);
    }

    /**
     * <p>Recibe la cedula o el nombre como parametro para realizar la busqueda del administrador
     * con dicha cedula o nombre. </p>
     * @param cedula Parametro para la localizacion del administrador en la base de datos.
     * @param nombre Parametro para la localizacion del administrador en la base de datos.
     * @param em  EntityManager para realizar las operacions con JPA.
     * @return VO correpondiente a Administrador mediante la busqueda por cedula(PK) o nombre,nulo si no existe.
     */
    public AdministradorVO buscar(String nombre, Long cedula,EntityManager em)throws NonUniqueResultException,NoResultException,PersistenceException {
        if (cedula!=0L){
            Administrador admin= adminDAO.encontrar(cedula, em);
            if (admin!=null ){
                AdministradorVO avo=new AdministradorVO(admin.getCedula(),
                        admin.getNombre(), admin.getContrasena(),
                        admin.getSala().getNombre(), admin.getCorreoUnal(),
                        admin.getOtroCorreo(), admin.getDireccion(), admin.getTelefono());
                return avo;
            }
        }else{
            Administrador admin= adminDAO.encontrarpornombre(nombre,em);
            if (admin!=null){
                AdministradorVO avo=new AdministradorVO(admin.getCedula(),
                        admin.getNombre(), admin.getContrasena(),
                        admin.getSala().getNombre(), admin.getCorreoUnal(),
                        admin.getOtroCorreo(), admin.getDireccion(), admin.getTelefono());
                return avo;
            }
        }
        return null;
        }
    /**
     <p>Busca una sala en especifico y cuenta el numero de administradores relativos a dicha sala.</p>
     *@param nombreSala String que guarda el nombre de la sala para realizar la busqueda.
     *@param em  EntityManager para realizar las operacions con JPA.
     * @return cantidad Entero que guarda el conteo realizado del nuemero de administradores por sala.
     */
    public int numeroDeAdministradoresPorSala(String nombreSala, EntityManager em) {
        AdministradorDAO adao = new AdministradorDAO();
        SalaDAO sdao = new SalaDAO();
        Sala sala = sdao.buscarPorNombre(nombreSala, em);
        int contador=0;
        ArrayList<Administrador> listaAdministradores = adao.listaActual(em);
        for (Administrador a :listaAdministradores){
            if (a.getSala().equals(sala)){
                contador++;
            }
        }
        return contador;
    }
    /**
     * <p>Edita la informacion del un administrador pasado como argumento</p>
     * @param avo  Administrador al cual se va a actualizar.
     * @param em  EntityManager para realizar las operacions con JPA.
     */
    public void actualizarAdministrador(AdministradorVO avo, EntityManager em)throws PersistenceException,Exception {
        AdministradorDAO adao = new AdministradorDAO();
        SalaDAO sdao = new SalaDAO();
        Administrador administrador= new Administrador(avo.getCedula(), avo.getNombre(),
                avo.getContrasena(), sdao.buscarPorNombre(avo.getNombresala(), em),
                avo.getCorreoUnal(), avo.getOtroCorreo(), avo.getDireccion(), avo.getTelefono());
        adao .actualizar(administrador, em);
    }

    public AdministradorVO[] listaAdministradores(EntityManager em) {
        AdministradorDAO adao = new AdministradorDAO();
        
        ArrayList<Administrador> listaAdministradores = adao.listaActual(em);
        ArrayList<AdministradorVO> listaAdministradorVO = new ArrayList<AdministradorVO>();
        for (Administrador a:listaAdministradores)
            listaAdministradorVO.add(new AdministradorVO(a.getCedula(), a.getNombre(), a.getContrasena(), a.getSala().getNombre(),a.getCorreoUnal(), a.getOtroCorreo(), a.getDireccion(), a.getTelefono()));
        AdministradorVO [] avos= new AdministradorVO[listaAdministradorVO.size()];
        listaAdministradorVO.toArray(avos);
        return avos;
    }
}
